﻿-- =============================================
-- Author:		zengfei	
-- Create date: 10m/14/2011
-- Description:	生成新的Serial No.子过程
-- =============================================
CREATE PROCEDURE Usp_SerialNoFromSetting
	@p_SerialNoName	varchar(30), 
	@p_Doc			varchar(500),
	@p_IsPreciseModel	bit,
	@p_RSerialNo	varchar(30) out
as
declare @Sql	nvarchar(500),
		@Param	nvarchar(500),
		@Idoc	int

select @Sql=N'Select @p_RSerialNo=',@Param='@p_RSerialNo varchar(30) Out'

select @Sql=@Sql+(case Seqnum when 1 then '' else '+' end)+
	(case Type
	when 'FUN' then Flag
	when 'CONST' then Flag 
	when 'UNAUTO' then (case @p_IsPreciseModel 
				when 0 then char(39)+'%'+char(39) 
				when 1 then char(39)+replicate('_',PosEnd-PosStart+1)+char(39)
				else Flag end)	-- 变化的数字段，非自动增长段，取匹配模板时为匹配字符(%,_)
	when 'AUTO' then (case @p_IsPreciseModel 
			when 0 then char(39)+'%'+char(39)
			when 1 then char(39)+replicate('_',PosEnd-PosStart+1)+char(39)
			else (case IsLeft
				when 1 then char(39)+replicate(Flag,PosEnd-PosStart)+'1'+char(39)
				else char(39)+'1'+replicate(Flag,PosEnd-PosStart)+char(39) end)
			 end)
	end)
from SerialNoSetting where SerialNoName=@p_SerialNoName order by Seqnum

if len(@p_Doc)>0
begin
	set @p_Doc=upper(@p_Doc)
	exec sp_xml_preparedocument @Idoc out,@p_Doc
	
	-- 此处替换时加上[]是为了防止一个参数和另一个参数名称部分相同，导致替换不能正确运行
	-- 另在设置SerialNoSetting表中Flag中带参数的Sql语句时，一定要给参数加上[]，即[@VariableName]
	select @Sql=replace(@Sql,'['+A.[NAME]+']',char(39)+A.[VALUE]+char(39)) from 
	(select * from openxml(@Idoc,'ROOT/PARAM',2) with(NAME varchar(20),VALUE varchar(20))) A
	
	exec sp_xml_removedocument @Idoc
end

--print @Sql
--print @param

exec sp_executesql @Sql,@Param,@p_RSerialNo out